#include "rgb24_video.h"
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <string.h>

#define log(...) do{                 \
            printf("rgb24_video:");  \
            printf(__VA_ARGS__);     \
            printf("\n");            \
        } while(0);

int rgb24_init(struct rgb24_object *rgb)
{
    int ret;

    /* 参数初始化 */
    memset(rgb, 0, sizeof(struct rgb24_object));
    rgb->file_name = "camera.rgb";
    rgb->pix_width = 1920;
    rgb->pix_height = 1080;
    rgb->frame_len = rgb->pix_width * rgb->pix_height * 3;
    log("[%d] param init ok.", 0);

    /* 打开文件 */
    if (NULL == rgb->file_name)
    {
        log("file name is empty");
        return -1;
    }

    rgb->file_fd = open(rgb->file_name, O_RDWR);
	if(rgb->file_fd < 0){
		log("can not openfile");
		return -1;
	}

    /* 获取文件大小 */
    rgb->file_size = lseek(rgb->file_fd, 0, SEEK_END);
    lseek(rgb->file_fd, 0, SEEK_SET);
    if(rgb->file_size < 0){
		log("lseek failed");
		return -1;
	}

    /* 建立内存映射 */
    rgb->file_mem_buffer = (uint8_t *)mmap(NULL , rgb->file_size, 
						PROT_READ | PROT_WRITE, MAP_SHARED, 
						rgb->file_fd, 0);
	if(rgb->file_mem_buffer == NULL){
		log("mmap failed");
		close(rgb->file_fd);
		return -1;
	}

    /* 关闭文件 */
    close(rgb->file_fd);
    rgb->file_fd = -1;

    return 0;
}

int rgb24_get_frame(struct rgb24_object *rgb)
{
    if ((rgb->frame_num + 1) * rgb->frame_len < rgb->file_size)
    {
        rgb->frame_buffer = rgb->file_mem_buffer + rgb->frame_num * rgb->frame_len;
        return rgb->frame_num++;
    }
    return -1;    
}

int rgb24_deinit(struct rgb24_object *rgb)
{
    /* 取消内存映射 */
    munmap(rgb->file_mem_buffer, rgb->file_size);

    /* 关闭文件 */
    if (rgb->file_fd >= 0)
    {
        close(rgb->file_fd);
        rgb->file_fd = -1;
    }
    
}
